export default class SocketService {
  // 单例
  static instence = null
  static get Instence() {
    if (!this.instence) {
      this.instence = new SocketService()
    }
    return this.instence // 返回实例对象
  }

  // 和服务器连接的socket 对象
  ws = null
  // 存储回调函数
  callBackMapping = {}
  // 连接状态
  connected=false
  // 记录重试次数
  sendRetryCount=0
  // 重新连接尝试的次数
  connectRetryCount=0

  // 和服务器连接的方法
  connect() {
    // 连接服务器  (ws逻辑在此)
    if (!window.WebSocket) {
      console.log('你的浏览器不支持websocket请求');
    } else {
      this.ws = new WebSocket('ws:127.0.0.1:9998')
    }

    // 连接上
    this.ws.onopen = () => {
      console.log('连接服务器成功');
      this.connected=true
      this.connectRetryCount=0
    }
    // 1连接失败
    // 2连接成功后服务器关闭
    this.ws.onclose = () => {
      console.log('连接服务器失败');
      this.connected=false
      // 重新尝试
      setTimeout(()=>{
        this.connectRetryCount++
        this.connect()
      },500*this.connectRetryCount)
    }
    // 
    this.ws.onmessage = (msg) => {
      console.log('接收数据');

      let resc = JSON.parse(msg.data)
      const socketType = resc.socketType
      // 频道回调函数是否存在
      if(this.callBackMapping[socketType]){
        if(resc.action==='getData'){
          // 获取数据
          const resData = JSON.parse(resc.data)
          // 调用方法
          this.callBackMapping[socketType].call(this,resData)

        }else if(resc.action==='fullScreen'){
          // 屏幕改变
          this.callBackMapping[socketType].call(this,resc)

        }else if(resc.action==='themeChange'){
          // 主题切换
          this.callBackMapping[socketType].call(this,resc)
        }
      }

    }
  }

    // 组件调用的方法
    // 回调函数注册
    registerCallBack(socketTypr,callBack){
      this.callBackMapping[socketTypr] = callBack
    }
    // 取消某一个回调函数
    unRegisterCallBack(socketType){
      this.callBackMapping[socketType] = null
    }

    // 发送数据的方法
    send(data){
      // 判断是否连接成功
      if(this.connected){
        this.ws.send(JSON.stringify(data))
      }else{
        // 延迟发送
        this.sendRetryCount++
        setTimeout(()=>{
          this.send(data)
        },this.sendRetryCount*500) // 逐层累加
      }
      
    }
}